package com.learn.spring_aop.dynamic_proxy.jdk_interface;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class JdkInterfaceProxy {
    /**
     * 产生目标类的代理对象
     *
     * @param target 目标类。被代理的对象
     * @return 代理类。代理目标类接口
     */
    public static Object createProxy(final Object target) {
        // (类加载器，类的接口，InvocationHandler实现类)
        return Proxy.newProxyInstance(
                target.getClass().getClassLoader(),
                target.getClass().getInterfaces(),
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println("方法前插入的操作");
                        
                        // 激活目标类内的目标方法
                        Object result = method.invoke(target, args);
                        
                        System.out.println("方法后插入的操作");
                        return result;
                    }
                }
        );
    }
}
